﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//int main()
//{
//	int* arr[10] = { NULL };//整形指针数组，里面放的是空指针
//	int* arr1[10]; //整形指针的数组
//	char* arr2[4]; //一级字符指针的数组
//	char** arr3[5];//二级字符指针的数组
//
//
//	int(*p)[10];
//	/*解释：p先和*结合，说明p是一个指针变量，然后指着指向的是一个大小为10个整型的数组。
//	所以p是一个指针，指向一个数组，叫数组指针。*/
//
//	int a[4];
//	int (*pa)[4] = &a;
//
//
//	return 0;
//
//}


//#include <stdio.h>
//int main()
//{
//	int arr[10] = { 0 };
//
//	printf("arr = %p\n", arr);
//	printf("&arr= %p\n", &arr);
//
//	printf("arr+1 = %p\n", arr + 1);
//	printf("&arr+1= %p\n", &arr + 1);
//
//	return 0;
//}
//
//#include <stdio.h>
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
//	int(*p)[10] = &arr;//把数组arr的地址赋值给数组指针变量p
//	//但是我们一般很少这样写代码
//	return 0;
//}

//
//#include <stdio.h>
//void test()
//{
//	printf("this is a test\n");
//}
//
//int main()
//{
//	printf("%p\n", test);
//	printf("%p\n", &test);
//
//	void (*p)() = &test;
//	printf("%p\n", p);
//
//	return 0;
//}
//
//void F1()
//{
//	printf("F1\n");
//}
//
//void F2()
//{
//	printf("F2\n");
//}
//
//void F3()
//{
//	printf("F3\n");
//}
//
//int main()
//{
//
//	void (*pf[3])() = { F1,F2,F3 };
//
//	for (int i = 0; i < 3; i++)
//	{
//		pf[i]();
//	}
//
//	return 0;
//}

#include <stdio.h>
//int add(int a, int b)
//{
//	return a + b;
//}
//int sub(int a, int b)
//{
//	return a - b;
//}
//int mul(int a, int b)
//{
//	return a * b;
//}
//int div(int a, int b)
//{
//	return a / b;
//}
//
//int main()
//{
//	int x, y;
//	int input = 1;
//	int ret = 0;
//	do
//	{
//		printf("*************************\n");
//		printf(" 1:add           2:sub \n");
//		printf(" 3:mul           4:div \n");
//		printf("*************************\n");
//		printf("请选择：");
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:
//			printf("输入操作数：");
//			scanf("%d %d", &x, &y);
//			ret = add(x, y);
//			printf("ret = %d\n", ret);
//			break;
//		case 2:
//			printf("输入操作数：");
//			scanf("%d %d", &x, &y);
//			ret = sub(x, y);
//			printf("ret = %d\n", ret);
//			break;
//		case 3:
//			printf("输入操作数：");
//			scanf("%d %d", &x, &y);
//			ret = mul(x, y);
//			printf("ret = %d\n", ret);
//			break;
//		case 4:
//			printf("输入操作数：");
//			scanf("%d %d", &x, &y);
//			ret = div(x, y);
//			printf("ret = %d\n", ret);
//			break;
//		case 0:
//			printf("退出程序\n");
//			break;
//		default:
//			printf("选择错误\n");
//			break;
//		}
//	} while (input);
//
//	return 0;
//}

//void menu()
//{
//	printf("****************************\n");
//	printf("***  1. add      2. sub  ***\n");
//	printf("***  3. mul      4. div  ***\n");
//	printf("***  0. exit             ***\n");
//	printf("****************************\n");
//}
//
//
//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int Sub(int x, int y)
//{
//	return x - y;
//}
//
//int Mul(int x, int y)
//{
//	return x * y;
//}
//
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//
//int main()
//{
//	int input = 0;
//	int x = 0;
//	int y = 0;
//	int ret = 0;
//	do
//	{
//		menu();
//		printf("请选择:>");
//		scanf("%d", &input);
//		//函数指针数组 - 转移表
//		int (*pfArr[])(int, int) = {NULL, Add, Sub, Mul, Div};
//		//                          0     1     2   3    4
//		if (0 == input)
//		{
//			printf("退出计算器\n");
//		}
//		else if (input >= 1 && input <= 4)
//		{
//			printf("请输入2个操作数:");
//			scanf("%d %d", &x, &y);
//			ret = pfArr[input](x, y);
//			printf("ret = %d\n", ret);
//		}
//		else
//		{
//			printf("选择错误，重新选择!\n");
//		}
//	} while (input);
//
//	return 0;
//}




void menu()
{
	printf("****************************\n");
	printf("***  1. add      2. sub  ***\n");
	printf("***  3. mul      4. div  ***\n");
	printf("***  0. exit             ***\n");
	printf("****************************\n");
}

int Add(int x, int y)
{
	return x + y;
}

int Sub(int x, int y)
{
	return x - y;
}

int Mul(int x, int y)
{
	return x * y;
}

int Div(int x, int y)
{
	return x / y;
}

void calc(int (*pf)(int,int))
{
	int x = 0;
	int y = 0;
	int ret = 0;
	printf("请输入2个操作数:");
	scanf("%d %d", &x, &y);
	ret = pf(x, y);
	printf("ret = %d\n", ret);
}

int main()
{
	int input = 0;

	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			calc(Add);
			break;
		case 2:
			calc(Sub);
			break;
		case 3:
			calc(Mul);
			break;
		case 4:
			calc(Div);
			break;
		case 0:
			printf("退出计算器\n");
			break;
		default:
			printf("选择错误, 重新选择\n");
			break;
		}
	} while (input);

	return 0;
}